//
// xmlhelper.h
// libprotea
// Tools Library for the Protea Projec / XML parsing helper functionality
// Copyright (C) 2003, 2004, 2005 eXegeSys, Inc.
// Copyright (C) 2008 Bruce A. James
//
// This program is part of the Protea Project.
//
// The Protea Project is free software; you can redistribute it and/or modify it 
// under the terms of the GNU General Public License as published by the 
// Free Software Foundation, either version 3 of the License, or (at your 
// option) any later version.
//
// The Protea Project is distributed in the hope that it will be useful, but 
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
// for more details.
// 
// You should have received a copy of the GNU General Public License along 
// with this program.  If not, see <http://www.gnu.org/licenses/>.
// 
// Please send correspondence to:
// 
// theproteaproject@gmail.com
//

#ifndef __PROTEA_XMLHELPER__H_
#define __PROTEA_XMLHELPER__H_

#include "OSDep/utf8.h"

#include <xercesc/sax/ErrorHandler.hpp> 
#include <xercesc/sax/SAXParseException.hpp>

// Xerces error handler
class DOMTreeConsoleErrorReporter : public XERCES_CPP_NAMESPACE::ErrorHandler
{
public:
    // -----------------------------------------------------------------------
    //  Constructors and Destructor
    // -----------------------------------------------------------------------
    DOMTreeConsoleErrorReporter() :
       fSawErrors(false)
    {
    }

    ~DOMTreeConsoleErrorReporter()
    {
    }


    // -----------------------------------------------------------------------
    //  Implementation of the error handler interface
    // -----------------------------------------------------------------------
	void warning(const XERCES_CPP_NAMESPACE::SAXParseException& toCatch) { ; };
	void error(const XERCES_CPP_NAMESPACE::SAXParseException& toCatch) {
		fSawErrors = true;
		cerr << "Error at file \"" << UniTranslator(toCatch.getSystemId()).UTF8()
					<< "\", line " << toCatch.getLineNumber()
					<< ", column " << toCatch.getColumnNumber()
			<< "\n   Message: " << UniTranslator(toCatch.getMessage()).UTF8() << endl;
		assert( false );
	};

	void fatalError(const XERCES_CPP_NAMESPACE::SAXParseException& toCatch) {
		fSawErrors = true;

		UniTranslator filename( toCatch.getSystemId() );

		cerr << "Fatal Error at file \"" << filename.UTF8()
					<< "\", line " << toCatch.getLineNumber()
					<< ", column " << toCatch.getColumnNumber()
			<< "\n   Message: " << UniTranslator(toCatch.getMessage()).UTF8() << endl;
		assert( false );
	};

	void resetErrors() {
		fSawErrors = false;
	};

    // -----------------------------------------------------------------------
    //  Getter methods
    // -----------------------------------------------------------------------
	bool getSawErrors() const { return fSawErrors; };

    // -----------------------------------------------------------------------
    //  Private data members
    //
    //  fSawErrors
    //      This is set if we get any errors, and is queryable via a getter
    //      method. Its used by the main code to suppress output if there are
    //      errors.
    // -----------------------------------------------------------------------
    bool    fSawErrors;
};

#endif
 
